package com.internetCafes.spms.web.sys.service.impl;

import com.internetCafes.spms.core.utils.RedisUtils;
import com.internetCafes.spms.web.sys.mapper.UserTokenInfoMapper;
import com.internetCafes.spms.web.sys.model.UserTokenInfo;
import com.internetCafes.spms.web.sys.oauth2.TokenGenerator;
import com.internetCafes.spms.web.sys.service.UserTokenInfoService;
import com.internetCafes.spms.core.utils.R;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service("sysUserTokenService")
public class UserTokenInfoServiceImpl implements UserTokenInfoService {

	@Autowired
	private UserTokenInfoMapper userTokenInfoMapper;

	@Value("${spring.pages.expire}")
	private int expire;

	@Value("${spring.profiles.active}")
	private String active;

	@Autowired
	private RedisUtils redisUtils;

/*
	@Override
	public UserTokenInfo queryByUserId(Long userId) {
		return userTokenInfoMapper.queryByUserId(userId);
	}
*/

	@Override
	public UserTokenInfo queryByUserId(Long userId) {
		String jsonObject = redisUtils.get(String.valueOf(userId));
		if (jsonObject!=null) {
			UserTokenInfo userTokenInfo = redisUtils.fromJson(jsonObject, UserTokenInfo.class);
			return userTokenInfo;
		}
		return null;

	}

/*
	@Override
	public UserTokenInfo queryByToken(String token) {
		return userTokenInfoMapper.queryByToken(token);
	}
*/

	@Override
	public UserTokenInfo queryByToken(String token) {
		String jsonObject = redisUtils.get(token);
		if (jsonObject!=null) {
			UserTokenInfo userTokenInfo = redisUtils.fromJson(jsonObject, UserTokenInfo.class);
			return userTokenInfo;
		}
		return null;
	}

/*
	@Override
	public void save(UserTokenInfo token) {
		userTokenInfoMapper.save(token);
	}
*/

	@Override
	public void save(UserTokenInfo token) {
		redisUtils.set(String.valueOf(token.getUserId()),redisUtils.toJson(token),expire);
		redisUtils.set(token.getToken(),redisUtils.toJson(token),expire);
	}

	/*

        @Override
        public void update(UserTokenInfo token) {
            userTokenInfoMapper.update(token);
        }
    */
	@Override
	public void update(UserTokenInfo token) {
		redisUtils.set(String.valueOf(token.getUserId()), redisUtils.toJson(token), expire);
		redisUtils.set(token.getToken(), redisUtils.toJson(token), expire);
	}


	@Override
	public R createToken(long userId) {
		// 生成一个token
//		String token = TokenGenerator.generateValue();
		// 修改 BY Zj 登录redis改为不变 规则为用户id + 环境
		String token = TokenGenerator.generateFixedValue(active + "_" + userId);

		// 当前时间
		Date now = new Date();
		// 过期时间
		Date expireTime = new Date(now.getTime() + expire * 1000);

		// 判断是否生成过token
		UserTokenInfo tokenEntity = queryByUserId(userId);
		if (tokenEntity == null) {
			tokenEntity = new UserTokenInfo();
			tokenEntity.setUserId(userId);
			tokenEntity.setToken(token);
			tokenEntity.setUpdateTime(now);
			tokenEntity.setExpireTime(expireTime);

			// 保存token
			save(tokenEntity);
		} else {
			redisUtils.delete(tokenEntity.getToken());
			tokenEntity.setToken(token);
			tokenEntity.setUpdateTime(now);
			tokenEntity.setExpireTime(expireTime);

			// 更新token
			update(tokenEntity);
		}

		R r = R.ok().put("token", token).put("expire", expire);

		return r;
	}

/*
	@Override
	public void logout(Long userId) {
		//生成一个token
		String token = TokenGenerator.generateValue();
		//修改token
		UserTokenInfo tokenEntity = new UserTokenInfo();
		tokenEntity.setUserId(userId);
		tokenEntity.setToken(token);
		update(tokenEntity);
	}
*/

	@Override
	public void logout(Long userId) {
		String jsonObject = redisUtils.get(String.valueOf(userId));
		if (jsonObject!=null) {
			UserTokenInfo userTokenInfo = redisUtils.fromJson(jsonObject, UserTokenInfo.class);
			redisUtils.delete(String.valueOf(userId));
			redisUtils.delete(userTokenInfo.getToken());
		}
	}

}
